Плохо! Плохо!:  0
Показано с 1 по 1 из 1

Тема: [MZ] DKR_SoundGenerator

  1. #1
    Бывалый Аватар для Darchan Kaen
    Информация о пользователе
    Регистрация
    17.06.2013
    Адрес
    Одесса
    Сообщений
    851
    Записей в дневнике
    3
    Репутация: 47 Добавить или отнять репутацию

    По умолчанию [MZ] DKR_SoundGenerator

    Название плагина: DKR_SoundGenerator

    Авторы: Yotam Mann, DarchanKaen

    Версия: 1.0

    Дата выхода:
    1.0 - 02.04.2022

    Описание плагина:
    Плагин позволяет генерировать и проигрывать звуки, при помощи библиотеки Tone.js
    Плагин является "оберткой", предоставляя:
    1) "Упрощенную" генерацию звуков по паттерну, их воспроизведение, в.т.ч. зацикленное.
    2) Полные возможности библиотеки Tone.js - для этого пишите в команде "Скрипт" нужный вам код!
    Звук, генерируемый плагином в упрощенном режиме невозможно остановить!!

    Нюансы:
    1) Генерируемый звук проигрывается поверх всех звуков мейкера и не контролируется его командами.
    2) Звук остановить нельзя, только выключить если он зациклен.
    3) Не все инструменты, ноты и время воспроизведения корректно работают друг с другом - проверяйте!
    4) Если вы знаете работу данной библиотеки, то пишите в команде "Скрипт" код для Tone.js и мейкер его сможет выполнить.
    5) Инструмент Sampler не входит в "упрощенный режим", т.к. зависит от внешних файлов.
    6) В любом случае, для корректного использования плагина ознакомьтесь з возможностями Tone.js отдельно от мейкера.
    7) Игра может медленнее запускаться, т.к. библиотека объемная.

    Использование плагина:
    У плагина нет параметров.

    Команды (в эвенте, в команде "Скрипт"):
    DKR.SoundGenerator.beep(); - издает короткий звук, игнорируя все настройки; для теста.
    DKR.SoundGenerator.stopRepeat(); - в случае зацикленности звука, останавливает его воспроизведение.
    DKR.SoundGenerator.setInstrument(instrumentName); - задает инструмент.
    DKR.SoundGenerator.setRepeatPause(pauseValue); - задает паузу при повторе зацикленного звука.
    DKR.SoundGenerator.setBPM(bpmValue); - задает темп звука.
    DKR.SoundGenerator.setVolume(volumeValue); - задает громкость звука.
    DKR.SoundGenerator.generate(pattern, timing, isRepeat); - задает паттерн для генерации, длительность звука, зациклить ли воспроизведение.

    где:
    instrumentName - имя инструмента, одно из: 'Synth' (по-умолчанию), 'AMSynth', 'DuoSynth', 'FMSynth', 'MembraneSynth', 'MetalSynth', MonoSynth', 'NoiseSynth', 'PluckSynth', 'PolySynth'.

    pauseValue - длительность перед повтором звука (по-умолчанию: 0.5).
    bpmValue - темп звука (по-умолчанию: 100).

    volumeValue - громкость звука (для уменьшения пишите отрицательное число).

    pattern - массив, состоящий из объектов звуков, что хранят в себе ноту с октавой и длительность, например:
    let pattern= [
    { note: "E5", duration: "8n" },
    { note: "A4", duration: "8n" },
    { note: "F8", duration: "8n" },
    { note: "D1", duration: "8n" }
    ;

    timing - длительность нот (например: 0.25).

    isRepeat - true (если нужна зацикленность звука) / false (если звук должен быть однократно воспроизведен).

    Примеры (в команде "Скрипт"):
    Спойлер Примеры паттернов и использования:

    1)
    Код:
    let notesList = [
      { note: "E5", duration: "8n" },
      { note: "D5", duration: "8n" },
      { note: "E5", duration: "8n" },
      { note: "D5", duration: "8n" },
      { note: "E5", duration: "8n" },
      { note: "B4", duration: "8n" }
    ]
    
    DKR.SoundGenerator.generate(notesList, 0.25, false);
    2)
    Код:
    let notesList = [
      { note: "E5", duration: "2n" },
      { note: "D5", duration: "8n" },
      { note: "E5", duration: "4n" },
      { note: "D5", duration: "8n" },
      { note: "E5", duration: "8n" },
      { note: "A1", duration: "2n" },
      { note: "B5", duration: "8n" },
      { note: "C3", duration: "6n" },
      { note: "D4", duration: "8n" },
      { note: "F7", duration: "8n" },
      { note: "A3", duration: "8n" },
      { note: "G5", duration: "5n" }
    ]
    
    DKR.SoundGenerator.setRepeatPause(0.25);
    DKR.SoundGenerator.setBPM(0.75);
    DKR.SoundGenerator.setVolume(-5);
    DKR.SoundGenerator.setInstrument('MonoSynth');
    
    DKR.SoundGenerator.generate(notesList, 0.5, true);


    Код:
    Спойлер Версия 1.0:

    Код:
    var Imported = Imported || {};
    Imported.DKR_SoundGenerator = true;
    
    var DKR = DKR || {};          
    DKR.SoundGenerator = DKR.SoundGenerator || {}; 
    DKR.SoundGenerator.version = 1.0;
    
    //-----------------------------------------------------------------------------
    /*:
     * @plugindesc (v.1.0.0) Плагин позволет генерировать и проигрывать звуки, при помощи библиотеки Tone.js
     * 
     * @target MZ
     * @author DarchanKaen, Yotam Mann
     *
     * @help
     *   DKR SoundGenerator
     * ----------------------------------------------------------------------------
     * ---Общая информация:
     * Плагин позволяет генерировать и проигрывать звуки, при помощи библиотеки Tone.js
     * Плагин является "оберткой", предоставляя:
     * 1) "Упрощенную" генерацию звуков по паттерну, их воспроизведение, в.т.ч. зацикленное.
     * 2) Полные возможности библиотеки Tone.js - для этого пишите в команде "Скрипт" нужный вам код!
     * Звук, генерируемый плагином в упрощенном режиме невозможно остановить!!
     * У плагина нет параметров.
     * ---Команды(в эвенте команда "Скрипт"):
     *    DKR.SoundGenerator.beep(); - издает короткий звук, игнорируя все настройки; для теста.
     *	  DKR.SoundGenerator.stopRepeat(); - в случае зацикленности звука, останавливает его воспроизведение.
     *	  DKR.SoundGenerator.setInstrument(instrumentName); - задает инструмент.
     *	  DKR.SoundGenerator.setRepeatPause(pauseValue); - задает паузу при повторе зацикленного звука.
     *	  DKR.SoundGenerator.setBPM(bpmValue); - задает темп звука.
     *	  DKR.SoundGenerator.setVolume(volumeValue); - задает громкость звука.
     *	  DKR.SoundGenerator.generate(pattern, timing, isRepeat); - задает паттерн для генерации, длительность звука, зациклить ли воспроизведения.
     * где:::
     *    instrumentName - имя инструмента, одно из: 'Synth' (по-умолчанию), 
     *    'AMSynth', 'DuoSynth', 'FMSynth', 'MembraneSynth', 'MetalSynth', 
     *	  'MonoSynth', 'NoiseSynth', 'PluckSynth', 'PolySynth'.
     *    pauseValue - длительность перед повтором звука (по-умолчанию: 0.5).
     *    bpmValue  - темп звука (по-умолчанию: 100)
     *    volumeValue - громкость звука (для уменьшения пишите отрицательное число).
     *    pattern - массив, состоящий из объектов звуков, что хранят в себе ноту с октавой и длительность, например:
     *	  let pattern = [
     *	    { note: "E5", duration: "8n" },
     *      { note: "A4", duration: "8n" },
     *      { note: "F8", duration: "8n" },
     *      { note: "D1", duration: "8n" }
     *	  ];
     *    timing - длительность нот (например: 0.25).
     *    isRepeat - true (если нужна зацикленность звука) / false (если звук должен быть однократно воспроизведен).
     * ---НЮАНСЫ:
     * 1) Генерируемый звук проигрывается поверх всех звуков мейкера и не контролируется его командами.
     * 2) Звук остановить нельзя, только выключить если он зациклен.
     * 3) Не все инструменты, ноты и время воспроизведения корректно работают друг с другом - проверяйте!
     * 4) Если вы знаете работу данной библиотеки, то пишите в команде "Скрипт" код для Tone.js и мейкер его сможет выполнить.
     * 5) Инструмент Sampler не входит в "упрощенный режим", т.к. зависит от внешних файлов.
     * 6) В любом случае, для корректного использования плагина ознакомьтесь з возможностями Tone.js отдельно от мейкера.
     *
     */
     
     
     
    ( () => {
    
    
    //---TONE_JS: BEGIN	
     
        const TONE_JS = 'Вырезано, т.к. ложило сайт. Скачайте плагин и откройте блокнотом для просмотра!';
      
    //---TONE_JS: END	
    
    //--DATA: BEGIN
    
        let instrument = new Tone.Synth().toDestination();
    	let repeatPause = 0.5;
    	let bpm = 100;
    	let volume = 0;
    	
    //--DATA: END
    
    //---LOGIC: BEGIN
    
        const beepSound = () => {
    		const synth = new Tone.Synth().toDestination();
            synth.triggerAttackRelease("C4", "8n");
    	}
    	
    	const stopSoundRepeat = () => {
    		Tone.Transport.stop();
    	}
    	
    	const setSoundInstrument = (instrumentName) => {
    		switch(instrumentName){
    			case 'AMSynth':
    				instrument = new Tone.AMSynth().toDestination();
    				break;
    			case 'DuoSynth':
    				instrument = new Tone.DuoSynth().toDestination();
    				break;
    			case 'FMSynth':
    				instrument = new Tone.FMSynth().toDestination();
    				break;
    			case 'MembraneSynth':
    				instrument = new Tone.MembraneSynth().toDestination();
    				break;
    			case 'MetalSynth':
    				instrument = new Tone.MetalSynth().toDestination();
    				break;
    			case 'MonoSynth':
    				instrument = new Tone.MonoSynth().toDestination();
    				break;
    			case 'NoiseSynth':
    				instrument = new Tone.NoiseSynth().toDestination();
    				break;
    			case 'PluckSynth':
    				instrument = new Tone.PluckSynth().toDestination();
    				break;
    			case 'Synth':
    				instrument = new Tone.Synth().toDestination();
    				break;
    			default:
    				instrument = new Tone.Synth().toDestination();
    				break;
    		}
    	}
    	
    	const setSoundRepeatPause = (rPause) => {
    		repeatPause = rPause;
    	}
    	
    	const setSoundBPM = (nBPM) => {
    		bpm = nBPM;
    	}
    	
    	const setSoundVolume = (nVolume) => {
    		volume = nVolume;
    	}
    	
    	const generateSound = (notesList, timing, isRepeat = false) => {
    		Tone.Transport.stop();
    		
    		let repeatInterval = ( notesList.length * timing ) + repeatPause;
    
    		const melody = () => {
                notesList.forEach( (tune, index) => {
                    const now = Tone.now();
    				let tuneTiming = index * timing;
                    instrument.triggerAttackRelease(tune.note, tune.duration, now + tuneTiming);
                })
            };
           
    		Tone.Transport.bpm.value = bpm;
    		instrument.volume.value += volume;
    	
    		if(true === isRepeat){
    			Tone.Transport.scheduleRepeat(melody, repeatInterval);
    		}else{
    			Tone.Transport.scheduleOnce(melody);
    		}
    		
    		Tone.Transport.start();
    	}
    	
    //---LOGIC: END
      	
    //---COMMANDS: BEGIN
    
        DKR.SoundGenerator.beep = function(){
    		beepSound();
    	}
    	
        DKR.SoundGenerator.stopRepeat = function(){
    		stopSoundRepeat();
    	}	
    	
    	DKR.SoundGenerator.setInstrument = function(instrumentName){
    		setSoundInstrument(instrumentName);
    	}
    	
    	DKR.SoundGenerator.setRepeatPause = function(repeatPause){
    		setSoundRepeatPause(repeatPause);
    	}
    	
    	DKR.SoundGenerator.setBPM = function(newBPM){
    		setSoundBPM(newBPM);
    	}
    	
    	DKR.SoundGenerator.setVolume = function(newVolume){
    		setSoundVolume(newVolume);
    	}
    	
    	DKR.SoundGenerator.generate = function(argsObj, timing, isRepeat){
    		generateSound(argsObj, timing, isRepeat);
    	}
    	
    	
    //---COMMANDS: END
    
    
    })();


    Загрузка:


    Условия поставки плагина:
    Поставляется AS-IS.
    Вся ответственность при использовании - на Пользователе!
    !

    Совместимость:
    Плагин не затрагивает логику работы мейкера, но с другими подобными плагинами может быть несовместим.
    Тем не менее, совместимость с другими плагинами не гарантируется.

    Спойлер Лирическое отступление:
    Лично мне всегда было сложновато находить музыку.
    Теперь можно меньше зависеть от сторонних ресурсов и больше - от фантазии.
    Ну и RTP-конкурс теперь немножко взломан. =)


    Благодарности:
    Yotam Mann за саму библиотеку, и всем остальным, чьи туториалы и примеры по ней я прочитал, просмотрел и поковырял.

    Полезная информация:
    Спойлер Ссылки:

    Сайт библиотеки с некоторыми примерами:
    https://tonejs.github.io/
    Сторонний туториал, охватывающий теорию электронной музыки:
    https://pdm.lsupathways.org/3_audio/
    Октавная система (в библиотеке и плагине используется "Научная нотация")
    https://ru.wikipedia.org/wiki/%D0%9E...B5%D0%BC%D0%B0


    P.S:
    Из кода плагина, что под спойлером, вырезан код библиотеки - из-за его объема "вешался" сайт.
    Если интересно - скачайте плагин и откройте блокнотом, перед его использованием.=
    Последний раз редактировалось Darchan Kaen; 02.04.2022 в 22:30. Причина: P.S

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
[MZ] DKR_SoundGenerator